/**
 * 业务数据配置接口定义
 * @author luguoxiang
 * @date 2022/7/5
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
import { Component } from 'vue';
import { PrimaryTableCol, ColProps, FormItemProps, FormRule } from 'tdesign-vue-next';
import { FilterTypeEnum } from '../enums';
import { IComponentProps, IInputComponentProps, InputComponentType } from './Interfaces';
import { Arrayable, UseUploaderOptions } from '@/soar';
import { BaseTableCol } from 'tdesign-vue-next/es/table/type';

/**
 * 字段数据类型
 */
export type DataType =
  | 'string'
  | 'number'
  | 'boolean'
  | 'datetime'
  | 'date'
  | 'time'
  | 'img'
  | 'file'
  | 'dict'
  | 'enum';

/**
 * 动态配置函数
 */
export declare interface Dynamic<T, D> {
  /**
   * 动态生成配置
   * @param params 参数
   */
  (params: { data: D; isUpdate?: boolean }): T; // 动态生成配置函数
}

/**
 * 可动态的
 */
export type DynamicAble<T, D> = T | Dynamic<T, D>;

/**
 * 模式基本字段定义
 */
export interface ISchema<K> {
  /**
   * 字段名
   */
  field?: K | string;
  /**
   * 字段显示名
   */
  label?: string;
  /**
   * 字段数据类型
   */
  dataType?: DataType;
  /**
   * 字段参数
   *    dataType是 dict 时这里配字典code；
   *    dataType是 file|img 时这里配 valueType；
   *    dataType是 datetime|date|time 时这里配时间格式，如：YYYY-MM-DD；
   *    dataType是 boolean 时这里配映射关系，如：'启用,禁用'；
   *    dataType是 enum 时这里配枚举选项，如：
   *        使用字符串配置：'A,B,C' 或 '1:A,2:B,3:C'
   *        使用数组配置：['A', 'B', 'C'] 或 ['1:A', '2:B', '3:C'] 或 [{ value: 0, label: 'A' }, { value: 1, label: 'B' }]
   *        使用对象配置：{ 0: 'A', 1: 'B', 2: 'C' }
   *        注意：'A,B,C' 和 ['A', 'B', 'C'] 的 value 是number类型的索引
   *             '1:A,2:B,3:C' 和 ['1:A', '2:B', '3:C'] 的 value 是冒号前面的字符串
   *             { 0: 'A', 1: 'B', 2: 'C' } 的 value 是 key 值
   */
  params?: Arrayable<string | { [key: string]: any }> | UseUploaderOptions['valueType'];

  /**
   * 显示控制，返回true则显示，可用于权限控制等，不同于vif，这里只执行一次，不影响性能
   */
  predicate?(): boolean;

  /**
   * 布局顺序（默认0，支持负数）
   */
  order?: number;
}

interface FormSlots<D> {
  /**
   * 组件插槽
   */
  default?: D | string;
  /**
   * label插槽
   */
  label?: D | string;
  /**
   * 错误插槽
   */
  tips?: D | string;
  /**
   * 帮助插槽
   */
  help?: D | string;
  /**
   * 状态图标插槽
   */
  statusIcon?: D | string;
}

interface TableSlots<D> {
  /**
   * 组件插槽
   */
  default?: D | string;
  /**
   * 表头
   */
  title?: D | string;
}

/**
 * 表单模式
 */
export interface IFormSchema<D> extends ISchema<keyof D> {
  /**
   * 插槽
   */
  slots?: keyof D | FormSlots<keyof D> | string;
  /**
   * 组件
   */
  component?: Component | string | InputComponentType;
  /**
   * 组件 props 参数
   */
  componentProps?: DynamicAble<IInputComponentProps, D>;
  /**
   * 列组件配置
   */
  colProps?: DynamicAble<IComponentProps | ColProps, D>;
  /**
   * 验证规则
   */
  rules?: boolean | string | DynamicAble<FormRule[], D>;
  /**
   * t-form-item 组件配置
   */
  formItemProps?: DynamicAble<FormItemProps, D>;
  /**
   * 组件禁用状态
   */
  disabled?: DynamicAble<boolean, D>;
  /**
   * 绑定组件v-show指令
   */
  hidden?: DynamicAble<boolean, D>;
  /**
   * 绑定v-if指令，返回 true 时渲染
   */
  vif?: Dynamic<boolean, D>;
}

/**
 * 搜索栏表单模式
 */
export interface ISearchSchema<D> extends IFormSchema<D> {
  /**
   * 搜索方式
   */
  searchType?: FilterTypeEnum;
}

/**
 * table列配置（参考 tdesign-vue-next t-table-column 配置）
 */
export interface ITableSchema<D> extends ISchema<keyof D>, PrimaryTableCol<D>, BaseTableCol<D> {
  /**
   * 插槽配置
   */
  slots?: keyof D | TableSlots<keyof D> | string;
  /**
   * 其他属性 参考 t-table-column
   */
  [p: string]: any;
}

interface DetailSlots<D> {
  /**
   * 内容插槽
   */
  default?: D | string;
  /**
   * 名称插槽
   */
  label?: D | string;
}

export interface IDetailSchema<D> extends ISchema<keyof D> {
  /**
   * 列组件配置
   */
  colProps?: IComponentProps | ColProps;
  /**
   * 绑定v-if指令，返回 true 时渲染
   */
  vif?: Dynamic<boolean, D>;

  /**
   * 插槽
   */
  slots?: keyof D | DetailSlots<keyof D> | string;
  /**
   * 数据格式化
   */
  formatter?(data: D, value: any): string;
  /**
   * 自定义显示组件
   */
  component?: Component | string;
  /**
   * 自定义显示组件参数
   */
  componentProps?: IComponentProps;
  /**
   * 自定义显示组件值绑定属性
   */
  valueProp?: string;
  /**
   * 标题元素配置
   */
  labelProps?: IComponentProps;
  /**
   * 值元素配置
   */
  valueProps?: IComponentProps;
}

/**
 * 总体配置接口（同时配置表单、table）
 */
export declare interface IConfigSchema<D> extends ISchema<keyof D> {
  /**
   * 字段名称，如：username、age、sex、logo
   */
  field: keyof D | string;
  /**
   * 字段显示名、中文名
   */
  label: string;
  /**
   * 表单配置
   */
  form?: IFormSchema<D> | false;
  /**
   * 搜索栏配置
   */
  search?: ISearchSchema<D> | false;
  /**
   * table列配置
   */
  table?: ITableSchema<D> | false;
  /**
   * 详情
   */
  detail?: IDetailSchema<D> | false;
}
